package cn.mujiankeji.mbrowser.界面.标签页.聚搜

import android.net.Uri
import cn.mujiankeji.mbrowser.数据.数据库.DBSearchEngine
import cn.mujiankeji.mbrowser.界面.框架.主视图.标签页状态
import kotlinx.coroutines.launch
import androidx.compose.foundation.pager.PagerState

import kotlinx.coroutines.CoroutineScope
import androidx.compose.runtime.mutableStateListOf
import cn.mujiankeji.mbrowser.app.应用接口
import cn.mujiankeji.mbrowser.app.应用操作.应用网页操作
import cn.mujiankeji.mbrowser.app.应用路由
import cn.mujiankeji.mbrowser.功能.浏览框.浏览框状态
import cn.mujiankeji.mbrowser.功能.浏览框.模型.浏览框页面配置
import cn.mujiankeji.mbrowser.工具.操作.地址操作
import cn.mujiankeji.mbrowser.数据.数据库.AppDatabase
import cn.mujiankeji.mbrowser.数据.数据库.DBWebsiteConfig
import cn.mujiankeji.mbrowser.数据.配置项.应用配置
import cn.mujiankeji.mbrowser.界面.小窗页.文本编辑窗口状态
import cn.mujiankeji.mbrowser.界面.标签页.网页.网页标签状态
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.runBlocking
import org.koin.core.context.GlobalContext

class 聚搜页面状态(
    val keyword: String,
    val searchEngine: DBSearchEngine
) : 标签页状态() {

    val webviews = mutableStateListOf<浏览框状态>()


    val pagerState = PagerState { searchEngine.地址列表.size }
    var coroutine : CoroutineScope ?= null

    fun 切换标签(index : Int){
        coroutine?.launch {
            pagerState.animateScrollToPage(index)
        }
    }

    init {
        super.关键词 = keyword
        searchEngine.地址列表.forEach { item->
            val urlToLoad = item.地址.replaceFirst("%s", Uri.encode(keyword))
                .replaceFirst("#KEY#", Uri.encode(keyword))

            val post = item.POST?.replaceFirst("%s", Uri.encode(keyword))
                ?.replaceFirst("#KEY#", Uri.encode(keyword))

            webviews.add(构建浏览框状态(urlToLoad))
        }

    }

    private fun 构建浏览框状态(地址 : String) : 浏览框状态{
        return 浏览框状态(
            页面配置 = 应用网页操作.取基础配置(加载地址 = 地址,"",false,false),
            响应状态更新 = {

            },
            响应加载新的页面 = { url->
                加载新地址(url,地址)
            },
            响应可否加载文件 = { url : String, header : Map<String,String>?->
                !应用网页操作.拦截检测(url,地址)
            },
            响应获取加载日记 = { listOf() },
            响应下载 = {url: String, userAgent: String?, contentDisposition: String?, mimetype: String?, contentLength: Long->
                应用网页操作.请求下载(url,userAgent, contentDisposition, mimetype, contentLength)
            },
            响应边缘颜色变化 = {顶部 : Int?,底部 : Int? -> },
            响应输入框 = {信息 : String,默认值 : String,回调 : (String?)->Unit ->
                文本编辑窗口状态(默认值,{信息}){
                    回调(it)
                }.显示()
            },
            响应确认框 = {信息 : String,回调 : (Boolean)->Unit->
                应用接口.信息框(信息){
                    回调(it)
                }
            },
            响应安装扩展或脚本 = {代码或地址 : String ->
                应用接口.安装扩展(代码或地址)
            },
            响应销毁页面 = {
                // 不支持
            }

        )
    }

    fun 加载新地址(url : String,referer : String) : Boolean{
        // 判定为脚本
        if (url.endsWith(".user.js")){
            coroutine?.launch {
                应用网页操作.请求尝试安装脚本(url)
            }
            return true
        }
        if (url.startsWith("http://") || url.startsWith("https://")){
            应用路由.加载(网页标签状态(url,referer,true))
        }
        else{
            应用路由.加载(url)
        }
        return true
    }

    fun 取基础配置(加载地址 : String) : 浏览框页面配置 {
        return runBlocking {
            GlobalContext.get().get<AppDatabase>()
                .网站配置().let {
                    val ql = it.获取配置(地址操作.取完整主机名(加载地址))
                    val p = 浏览框页面配置(
                        起始地址 = 加载地址,
                        来源地址 = "",
                        是否为搜索进入页 = false,
                        启用内容合规检测 = 应用配置.读取网页内容合规检测().first(),
                        启用暗色模式 = 应用配置.读取当前主题颜色().first(),
                        启用电脑模式 = 应用配置.读取强制启动电脑模式().first(),
                        启用无痕模式 = 应用配置.读取无痕模式().first(),
                        启用无图模式 = 应用配置.读取浏览框无图模式().first(),
                        启用脚本支持 = 应用配置.读取启用浏览框脚本().first(),
                        启用用户脚本 = 应用配置.读取启用用户脚本().first(),
                        启用自动翻译 = false,
                        允许第三方Cookie  = 应用配置.读取浏览框支持第三方COOKIE().first(),
                        UA标识 = 应用配置.读取默认UA标识().first(),
                    )
                    if (ql != null){
                        更新配置(ql,p)
                    }else{
                        p
                    }
                }
        }
    }
    fun 更新配置(db : DBWebsiteConfig, 浏览框页面配置: 浏览框页面配置) : 浏览框页面配置 {
        return 浏览框页面配置.copy(
            UA标识 = db.UA,
            启用暗色模式 = db.启用暗色模式,
            启用自动翻译 = db.启用自动翻译,
            启用电脑模式 = db.启用电脑模式,
            启用无痕模式 = db.启用无痕模式,
            启用无图模式 = db.启用无图模式,
            启用脚本支持 = db.启用脚本支持,
            启用用户脚本 = db.启用用户脚本,
            启用内容合规检测 = db.启用内容合规检测,
            允许第三方Cookie = db.启用允许第三方Cookie,
        )
    }

}